home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 45
/
Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso
/
Aminet
/
gfx
/
x11
/
x3270_3_2_16.lha
/
amiga_src
/
CmeLine.c
< prev
next >
Wrap
C/C++ Source or Header
|
2001-06-24
|
10KB
|
309 lines
/* (from) $XConsortium: SmeLine.c,v 1.13 91/07/23 12:23:21 rws Exp $ */
/*
* Modifications Copyright 1995, 1999 by Paul Mattes.
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation.
*
* Copyright 1989 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. M.I.T. makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Chris D. Peterson, MIT X Consortium
*/
/*
* Cme.c - Source code for the generic menu entry
* (from) Sme.c - Source code for the generic menu entry
*
* Date: September 26, 1989
*
* By: Chris D. Peterson
* MIT X Consortium
* kit@expo.lcs.mit.edu
*/
#include "globals.h"
#if defined(X3270_MENUS) /*[*/
#include <stdio.h>
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/XawInit.h>
#include "CmeLineP.h"
#include <X11/Xaw/Cardinals.h>
#define offset(field) XtOffsetOf(CmeLineRec, cme_line.field)
static XtResource resources[] = {
{XtNlineWidth, XtCLineWidth, XtRDimension, sizeof(Dimension),
offset(line_width), XtRImmediate, (XtPointer) 1},
{XtNstipple, XtCStipple, XtRBitmap, sizeof(Pixmap),
offset(stipple), XtRImmediate, (XtPointer) XtUnspecifiedPixmap},
{XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
offset(foreground), XtRString, XtDefaultForeground},
};
#undef offset
/*
* Function definitions.
*/
static void Redisplay(Widget, XEvent *, Region);
static void Initialize(Widget, Widget, ArgList, Cardinal *);
static void DestroyGC(Widget);
static void CreateGC(Widget);
static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *);
static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *,
XtWidgetGeometry *);
#define SUPERCLASS (&cmeClassRec)
void relay_func4(void)
{
XawInitializeWidgetSet();
}
CmeLineClassRec cmeLineClassRec = {
{
/* superclass */ (WidgetClass) SUPERCLASS,
/* class_name */ "CmeLine",
/* size */ sizeof(CmeLineRec),
/* class_initialize */ relay_func4,
/* class_part_initialize*/ NULL,
/* Class init'ed */ FALSE,
/* initialize */ Initialize,
/* initialize_hook */ NULL,
/* realize */ NULL,
/* actions */ NULL,
/* num_actions */ ZERO,
/* resources */ resources,
/* resource_count */ XtNumber(resources),
/* xrm_class */ NULLQUARK,
/* compress_motion */ FALSE,
/* compress_exposure */ FALSE,
/* compress_enterleave*/ FALSE,
/* visible_interest */ FALSE,
/* destroy */ DestroyGC,
/* resize */ NULL,
/* expose */ Redisplay,
/* set_values */ SetValues,
/* set_values_hook */ NULL,
/* set_values_almost */ 0,
/* get_values_hook */ NULL,
/* accept_focus */ NULL,
/* intrinsics version */ XtVersion,
/* callback offsets */ NULL,
/* tm_table */ NULL,
/* query_geometry */ QueryGeometry,
/* display_accelerator*/ NULL,
/* extension */ NULL
},{
/* Menu Entry Fields */
#ifndef AMIGA
/* highlight */ XtInheritHighlight,
/* unhighlight */ XtInheritUnhighlight,
/* notify */ XtInheritNotify,
#else
NULL,NULL,NULL,
#endif
/* extension */ NULL
},{
/* Line Menu Entry Fields */
/* extension */ NULL
}
};
WidgetClass cmeLineObjectClass = (WidgetClass) &cmeLineClassRec;
#ifdef AMIGA
void AMIGA_INIT_CMELINE(void)
{
cmeLineClassRec.set_values_almost=XtInheritSetValuesAlmost;
cmeLineClassRec.highlight=SUPERCLASS->highlight;
cmeLineClassRec.unhighlight=SUPERCLASS->unhighlight;
cmeLineClassRec.notify=SUPERCLASS->notify;
}
#endif
/************************************************************
*
* Semi-Public Functions.
*
************************************************************/
/* Function Name: Initialize
* Description: Initializes the complex menu widget
* Arguments: request - the widget requested by the argument list.
* new - the new widget with both resource and non
* resource values.
* Returns: none.
*/
static void
Initialize(Widget request unused, Widget new, ArgList args unused,
Cardinal *num_args unused)
{
CmeLineObject entry = (CmeLineObject) new;
if (entry->rectangle.height == 0)
entry->rectangle.height = entry->cme_line.line_width;
CreateGC(new);
}
/* Function Name: CreateGC
* Description: Creates the GC for the line entry widget.
* Arguments: w - the Line entry widget.
* Returns: none
*
* We can only share the GC if there is no stipple, because
* we need to change the stipple origin when drawing.
*/
static void
CreateGC(Widget w)
{
CmeLineObject entry = (CmeLineObject) w;
XGCValues values;
XtGCMask mask = GCForeground | GCGraphicsExposures | GCLineWidth ;
values.foreground = entry->cme_line.foreground;
values.graphics_exposures = FALSE;
values.line_width = entry->cme_line.line_width;
if (entry->cme_line.stipple != XtUnspecifiedPixmap) {
values.stipple = entry->cme_line.stipple;
values.fill_style = FillStippled;
mask |= GCStipple | GCFillStyle;
entry->cme_line.gc = XCreateGC(XtDisplayOfObject(w),
RootWindowOfScreen(XtScreenOfObject(w)),
mask, &values);
}
else
entry->cme_line.gc = XtGetGC(w, mask, &values);
}
/* Function Name: DestroyGC
* Description: Destroys the GC when we are done with it.
* Arguments: w - the Line entry widget.
* Returns: none
*/
static void
DestroyGC(Widget w)
{
CmeLineObject entry = (CmeLineObject) w;
if (entry->cme_line.stipple != XtUnspecifiedPixmap)
XFreeGC(XtDisplayOfObject(w), entry->cme_line.gc);
else
XtReleaseGC(w, entry->cme_line.gc);
}
/* Function Name: Redisplay
* Description: Paints the Line
* Arguments: w - the menu entry.
* event, region - NOT USED.
* Returns: none
*/
static void
Redisplay(Widget w, XEvent *event unused, Region region unused)
{
CmeLineObject entry = (CmeLineObject) w;
int y = entry->rectangle.y +
(int)(entry->rectangle.height - entry->cme_line.line_width) / 2;
if (entry->cme_line.stipple != XtUnspecifiedPixmap)
XSetTSOrigin(XtDisplayOfObject(w), entry->cme_line.gc, 0, y);
XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w),
entry->cme_line.gc,
0, y, (unsigned int) entry->rectangle.width,
(unsigned int) entry->cme_line.line_width );
}
/* Function Name: SetValues
* Description: Relayout the menu when one of the resources is changed.
* Arguments: current - current state of the widget.
* request - what was requested.
* new - what the widget will become.
* Returns: none
*/
static Boolean
SetValues(Widget current, Widget request unused, Widget new,
ArgList args unused, Cardinal *num_args unused)
{
CmeLineObject entry = (CmeLineObject) new;
CmeLineObject old_entry = (CmeLineObject) current;
if ( (entry->cme_line.line_width != old_entry->cme_line.line_width) &&
(entry->cme_line.stipple != old_entry->cme_line.stipple) ) {
DestroyGC(current);
CreateGC(new);
return(TRUE);
}
return(FALSE);
}
/* Function Name: QueryGeometry.
* Description: Returns the preferred geometry for this widget.
* Arguments: w - the menu entry object.
* itended, return - the intended and return geometry info.
* Returns: A Geometry Result.
*
* See the Intrinsics manual for details on what this function is for.
*
* I just return the height and a width of 1.
*/
static XtGeometryResult
QueryGeometry(Widget w, XtWidgetGeometry *intended,
XtWidgetGeometry *return_val)
{
CmeObject entry = (CmeObject) w;
Dimension width;
XtGeometryResult ret_val = XtGeometryYes;
XtGeometryMask mode = intended->request_mode;
width = 1; /* we can be really small. */
if ( ((mode & CWWidth) && (intended->width != width)) ||
!(mode & CWWidth) ) {
return_val->request_mode |= CWWidth;
return_val->width = width;
mode = return_val->request_mode;
if ( (mode & CWWidth) && (width == entry->rectangle.width) )
return(XtGeometryNo);
return(XtGeometryAlmost);
}
return(ret_val);
}
#endif /*]*/